<?php
	/**	@brief Esta clase es la encargada de construir objetos de un nombre segun el cual se registraron.
		Basicamente x_factory es una clase completamente estatica, que puede crear objetos a partir de un alias registrado...
		ideal para un tag xml ;)
		Los objetos deben registrarse a si mismos (despues de la defincicion de clases, idealmente).
	*/
	class x_factory{
		private static $comps=array(); ///< array de componentes registrados
		private static $st_reg=0; ///< contador de objetos registrados
		private static $st_cre=0; ///< contador de objetos creados

	/**	@brief Retorna cantidad de objetos registrados por la clase.*/
		static function stats_registered(){ return self::$st_reg; }
	/**	@brief Retorna cantidad de objetos creados por la clase.*/
		static function stats_created(){ return self::$st_cre; }

	/**	@brief Retorna true si cierto alias fue registrado.
		@param $alias Alias del objeto.	*/
		static function registered($alias){
			return isset(self::$comps[$alias]) && !emptystr(self::$comps[$alias]);
		}
	
	/**	@brief Registra un componente y su alias para poder ser creado co create_comp()
		@param $alias Alias del objeto.	
		@param $classname Nombre de la clase a registrar.
		*/
		static function reg_comp($alias,$classname){
			if(self::registered($alias))		//intenta registrar algo ya registrado
				throw new Exception('El nombre ['.$alias.'] fue registrado para la clase ['.self::$comps[$alias].'] 
				no se puede registrar para ['.$classname.']');
			else{
					self::$comps[$alias]=$classname;
					self::$st_reg++;
			}
		}
		
	/**	@brief Crea un componente segun su alias.
		@param $alias Alias del objeto a crear.	
		@param $id para asignarle al objeto.
		@param $extra parametro extra
		*/
		static function create_comp($alias,$id,$extra=''){
			if(!self::registered($alias))
				throw new Exception('El nombre ['.$alias.'] no fue registrado');
			else{
			/*	if(emptystr($id))
					$id=self::random_id();*/
					
				$more=emptystr($extra)?'':",'$extra'";
				eval('$obj = new '.self::$comps[$alias]."('$id'".$more.");");
				self::$st_cre++;
				return $obj;
			}
		}

	}
?>